import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.swing.JOptionPane;

public class SaxtiehuisClient {
	private Context namingContext;
	private int orderNr;
	private String klantNaam;
	private Properties producten;

	public SaxtiehuisClient(String klantNaam) {
		this.orderNr = -1;
		this.producten = new Properties();
		this.klantNaam = klantNaam;
		System.setProperty("java.security.policy", "policy.policy");
		System.setSecurityManager(new RMISecurityManager());
		Properties iiop = new Properties();
		iiop.put("java.naming.factory.initial",
				"com.sun.jndi.cosnaming.CNCtxFactory");
		iiop.put("java.naming.provider.url", "iiop://192.168.43.191/");
		try {
			namingContext = new InitialContext(iiop);
		} catch (NamingException e) {
			JOptionPane.showMessageDialog(null, e.getExplanation(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}

	public List<String> getProducten() {
		try {
			Object objRef = namingContext.lookup("huis");
			Saxtiehuis saxtiehuis = (Saxtiehuis) PortableRemoteObject.narrow(
					objRef, Saxtiehuis.class);
			Properties productenLijst = saxtiehuis.getProductenLijst(null);
			Enumeration<?> keys = productenLijst.propertyNames();
			List<String> prodLijst = new ArrayList<String>();
			while (keys.hasMoreElements()) {
				String key = (String) keys.nextElement();
				String value = productenLijst.getProperty(key);
				prodLijst.add(value);
				producten.put(value, key);
			}
			return prodLijst;
		} catch (NamingException e) {
			JOptionPane.showMessageDialog(null, e.getExplanation(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
		return null;
	}

	public boolean maakBestellingAan() {
		try {
			Object objRef = namingContext.lookup("huis");
			Saxtiehuis saxtiehuis = (Saxtiehuis) PortableRemoteObject.narrow(
					objRef, Saxtiehuis.class);
			orderNr = saxtiehuis.maakNieuweBestelling(klantNaam);
			if(orderNr < 0){
				return false;
			}else{
				return true;
			}
		} catch (NamingException e) {
			JOptionPane.showMessageDialog(null, e.getExplanation(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
		return false;
	}

	public boolean bestelProduct(String beschrijving, int aantal) {
		try {
			Object objRef = namingContext.lookup("huis");
			int productCode = Integer.parseInt(producten
					.getProperty(beschrijving));
			Saxtiehuis saxtiehuis = (Saxtiehuis) PortableRemoteObject.narrow(
					objRef, Saxtiehuis.class);
			return saxtiehuis.bestel(klantNaam, orderNr, productCode, aantal);

		} catch (NamingException e) {
			JOptionPane.showMessageDialog(null, e.getExplanation(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
		return false;
	}
	
	public String getOverzicht(){
		try {
			Object objRef = namingContext.lookup("huis");
			Saxtiehuis saxtiehuis = (Saxtiehuis) PortableRemoteObject.narrow(
					objRef, Saxtiehuis.class);
			return saxtiehuis.getBestelOverzicht(klantNaam, orderNr);

		} catch (NamingException e) {
			JOptionPane.showMessageDialog(null, e.getExplanation(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
		return null;
	}
	
	public boolean bevestigBestelling(){
		try {
			Object objRef = namingContext.lookup("huis");
			Saxtiehuis saxtiehuis = (Saxtiehuis) PortableRemoteObject.narrow(
					objRef, Saxtiehuis.class);
			return saxtiehuis.bevestigBestelling(klantNaam, orderNr);
		} catch (NamingException e) {
			JOptionPane.showMessageDialog(null, e.getExplanation(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
		return false;
	}
}
